#ifndef B2D_ACTOR_H
#define B2D_ACTOR_H

#include "Spatial.h"
#include "RigidBody.h"
#include "IUpdateHandler.h"
#include "IRenderable.h"

NS_B2D_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Base class for all actors.
////////////////////////////////////////////////////////////////////////////////////////////////////
class B2D_API Actor
	: public Spatial
	, public IUpdateHandler
	, public IRenderable
{
	B2D_OBJECT

protected:
	// Physics
	b2Body* mRigidBody;
	bool mPhysicsEnabled;

public:
	Actor(void);
	virtual ~Actor(void);

	// ::Spatial
	virtual void setPosition(float x, float y);
    virtual void setRotation(float r);
	virtual void setScale(float sx, float sy);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Queries if the physics is enabled.
	///
	/// \return	true if the physics is enabled, false if not.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool isPhysicsEnabled(void) const { return mPhysicsEnabled; }
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Sets physics enabled.
	///
	/// \param	enabled	true to enable, false to disable.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void setPhysicsEnabled(bool enabled);
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Creates a rigid body for this actor. If a rigid body has already been defined, it will
	/// 		be removed before creating the new one.
	///
	/// \param	def	The definition.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void createRigidBody(const RigidBodyDef& def);
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Destroys the rigid body associated with this actor if it exists.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void destroyRigidBody(void);

	
	// ::IUpdateHandler
	void update(float dt);
	// ::IRenderable
	void render(IGraphicsDevice& g) const;

protected:
	void updateTransformFromRigidBody(void);
	FORCE_INLINE void updateRigidBodyTransform(void);
};

NS_B2D_END

#endif